package day05;

/**
 * @author aiPlusPlus
 * @version 1.0
 * @date 2023/1/5 9:42
 */

/**
 * 请实现一个函数用来判断字符串是否表示数值（包括整数和小数）。
 *
 * 数值（按顺序）可以分成以下几个部分：
 *
 * 若干空格
 * 一个 小数 或者 整数
 * （可选）一个 'e' 或 'E' ，后面跟着一个 整数
 * 若干空格
 * 小数（按顺序）可以分成以下几个部分：
 *
 * （可选）一个符号字符（'+' 或 '-'）
 * 下述格式之一：
 * 至少一位数字，后面跟着一个点 '.'
 * 至少一位数字，后面跟着一个点 '.' ，后面再跟着至少一位数字
 * 一个点 '.' ，后面跟着至少一位数字
 * 整数（按顺序）可以分成以下几个部分：
 *
 * （可选）一个符号字符（'+' 或 '-'）
 * 至少一位数字
 * 部分数值列举如下：
 *
 * ["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
 * 部分非数值列举如下：
 *
 * ["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
 *
 *
 * 示例 1：
 *
 * 输入：s = "0"
 * 输出：true
 * 示例 2：
 *
 * 输入：s = "e"
 * 输出：false
 * 示例 3：
 *
 * 输入：s = "."
 * 输出：false
 * 示例 4：
 *
 * 输入：s = "    .1  "
 * 输出：true
 */
public class Solution2 {
    public boolean isNumber(String s) {
        int length = s.length();
        int index = 0;
        while (index < length && s.charAt(index) == ' ') {
            index++;
        }
        if (index == length) {
            return false;
        }
        if (s.charAt(index) == '+' || s.charAt(index) == '-') {
            index++;
        }
        if (index == length) {
            return false;
        }
        int beforePoint = 0, afterPoint = 0;
        boolean point = false;
        while (index < length && s.charAt(index) != ' ' && !Character.isLetter(s.charAt(index))) {
            char c = s.charAt(index);
            if (c == '.') {
                if (!point) {
                    point = true;
                } else {
                    return false;
                }
            } else if (Character.isDigit(c)) {
                if (!point) {
                    beforePoint++;
                } else {
                    afterPoint++;
                }
            } else {
                return false;
            }
            index++;
        }
        if (beforePoint == 0 && afterPoint == 0) {
            return false;
        }
        if (index < length && s.charAt(index) == ' ') {
            while (index < length) {
                if (s.charAt(index) != ' ') {
                    return false;
                }
                index++;
            }
        }
        if (index == length) {
            return true;
        }
        char letter = s.charAt(index);
        if (letter != 'E' && letter != 'e') {
            return false;
        }
        index++;
        if (index < length && (s.charAt(index) == '+' || s.charAt(index) == '-')) {
            index++;
        }
        if (index == length || s.charAt(index) == ' ') {
            return false;
        }
        while (index < length && s.charAt(index) != ' ') {
            if (!Character.isDigit(s.charAt(index))) {
                return false;
            }
            index++;
        }
        while (index < length) {
            if (s.charAt(index) != ' ') {
                return false;
            }
            index++;
        }
        return true;
    }
}
